robloxfandomcom_pl-20200214-history
Tworzenie KeyPad'a
Poradnik ten pokaże w jaki sposób można zbudować drzwi na kod. Jednakże nie jest to jedyne zastosowanie KeyPad'a, ponieważ możecie też zrobić np. atomówkę odpalaną, zatrzymywaną, uzbrajaną i rozbrajaną kodem. Tu jednak zajmiemy się kodem otwierającym drzwi. Model Na samym początku stwórzmy odpowiedni model. Zróbmy drzwi jako jeden blok i stwórzmy do drzwi ramkę, na której umieścimy keypad. Wszystkie bloki powinny być anchored. Przykład: left Klocek, który będzie naszymi drzwiami nazwijmy Door. Drzwi wraz z ramką połączmy w jeden model(group) i nazwijmy go Gate. Teraz stwórzmy model naszego KeyPad'a. Po prost stwórzmy cienki blok i umieśćmy go na ramce drzwi. Na tym cienkim bloku umieśćmy na samej górze również cienki, podłóżny blok. Będzie to nasz wyświetlacz. Pod tym blokiem umieść 12 cienkich, małych bloków. To zaś będą nasze przyciski. 10 z tych przycisków nazwij numerami od zera do dziewięciu, a pozostałe dwa nazwij Clear i OK. Teraz na te przyciski należy nałożyć tekstury. Możesz je sam zauploadować na serwery ROBLOX, ale możesz też użyć darmowych decali. Tak też zrobimy. Otwórz okno Insert>My Models i w zakładce Search z listy wybierz Decals. Poszukajmy numerów, bo to o nie nam chodzi. Wpisz number i wyszukaj. Umieść tekstury na odpowiednich blokach. Powinieneś mieć podobny efekt: left Następnie do każdego z dwunastu przycisków utwórz obiekty ClickDetector. Pozwolą one nam sprawdzić, czy gracz wcisnął przycisk. Teraz połącz wszystkie bloki KeyPad'u w jeden model i nazwij go Keypad ''i umieść go w modelu ''Gate. Teraz wewnątrz bloku Display stwórz obiekt typu SurfaceGUI, a w nim utwórz obiekt TextLabel. Obiekty SurfaceGUI służą do wyświetlania na ścianie bloku. Na bloku Display powinno coś Ci się pojawić. Jeżeli kompletnie nic nie widzisz, to zmieniaj parametr Face obiektu SurfaceGUI do czasu aż pojawi Ci się "coś". To "coś" będzie niemalże niewidoczne. Tym czymś jest obiekt TextLabel odpowiedzialny za wyświetlanie tekstu. Musimy go przeskalować na całą ścianę. W tym celu zmirń jego parametr Size na {1, 0},{1, 0} i wybierz 48 rozmiar czcionki(FontSize). Domyślam się, że nadal nie widzisz tekstu znajdującego się na tym bloku. To dlatego, że SurfaceGUI ma za wysoką rozdzielczość. Zaznacz obiekt SurfaceGUI i edytuj jego parametr CanvasSize. W moim przypadku dobrymi rozmiarami było 200, 100. Tekst powinien stać się teraz widoczny. Jednak zanim zaczniemy pisać skrypty musimy zrobić jeszcze dwa małe kroki. Chcę, by po wpisanie dobrego kodu wyświetlił się napis "ACCESS APPROVED", a gdy wprowadzony zostanie błędny kod - "ACCESS DENIED". W tym celu nazwij obiekt TextLabe''l "Code" i zduplikuj go dwa razy. Powstałe dwa obiekty nazwij "Denied" i "Approved". Teraz jeden tekst nachodzi na drugi, a ten na trzeci i widać tylko jeden. Abyś mógł widzieć tylko "Approved" w obiektach "Code" i "Denied" odznacz pole ''Visible. Zmień parametr Text tego obiektu na "ACCESS APPROVED" i wybierz kolor tekstu(TextColor3) na zielony. Teraz zrób to samo z obiektem Denied, tyle że wpisz "ACCESS DENIED" i ustaw kolor na czerwony. Po tym wszystkim odznacz pola Visible zostawiając widoczny tylko obiekt "Code". Jeszcze tylko wyczyść pole Text obiektu "Code" i utwórz nowy obiekt IntValue w "Keypad" i nazwij go "KeyCode". Skrypt Nadszedł czas na najtrudniejszą część. Otóż musimy napisać skrypt do naszego modelu. Na początku zdobądźmy dostęp do naszego hasła: KeyCode = script.Parent:FindFirstChild("KeyCode"); Utwórzmy jeszcze zmienną globalną, w której przechowywany będzie wpisywany kod. Niech nil będzie jej wartością początkową: DynCode = nil; Musimy jeszcze zrobić bardzo żmudną rzecz. Musimy stworzyć zmienne wskazujące na każdy z obiektów wykrywających naciśnięcie myszą. Wszystkie te obiekty umieśćmy w tablicy. Elementy 1-9 będą oznaczały odpowiadające im liczby, element 10 to 0, a element 11 to OK, a 12 to Clear: button = { script.Parent:FindFirstChild("1"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("2"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("3"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("4"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("5"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("6"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("7"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("8"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("9"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("0"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("OK"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("Clear"):FindFirstChild("ClickDetector"), } Oraz wskażmy na nasze drzwi oraz na: Door = script.Parent.Parent:FindFirstChild("Drzwi"); Oraz na obiekty tektów na wyświetlaczu: Approved = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Approved"); Code = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Code"); Denied = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Denied"); Teraz napiszmy funkcję, która będzie wpisywała na koniec zmiennej z kodem cyfrę wprowadzoną jako argument: function addDigit(digit) if DynCode nil then DynCode = digit;--jezeli wpisywany kod jest pusty, to wpisywana cyfra jest cala liczba else DynCode = DynCode * 10 + digit; --jezeli kod ma wartosc, to zostaje ona pomnozona przez 10 czego skutkiem jest przesuniecie liczby w lewo i dodanie na koncu zera. W miejsce zera dodajemy nowa cyfre -- end end Napiszmy dwie funkcje, które będą odpowiadały na reakcje. Funkcja correct zostanie wywołana, gdy kod będzie poprawny. Spowoduje ona wyświetlenie tekstu Approved i zniknięcie reszty oraz wyłączenie kolizji i zmianę przezroczystości. Po określonym czasie(tu 4 sekundy) wszystko wróci do normy, a wpisany kod zostanie wyczyszczony: function correct() Approved.Visible=true; Code.Visible=false; Denied.Visible=false; Door.CanCollide=false; Door.Transparency = 0.4; wait(4); Approved.Visible=false; Code.Visible=true; Door.CanCollide=true; Door.Transparency = 0; DynCode=nil; end Funkcja incorrect spowoduje wypisanie na trzy sekundy tekstu Denied oraz wyczyszczenie kodu: function incorrect() Approved.Visible=false; Code.Visible=false; Denied.Visible=true; wait(3); Code.Visible=true; Denied.Visible=false; DynCode=nil; end Przejdźmy do głównego działanie skryptu. Będzie to zestaw reakcji na wciśnięcia przycisków. A więc zacznijmy od reakcji na cyfry: button1.MouseClick:connect(function()addDigit(1); end); button2.MouseClick:connect(function()addDigit(2); end); button3.MouseClick:connect(function()addDigit(3); end); button4.MouseClick:connect(function()addDigit(4); end); button5.MouseClick:connect(function()addDigit(5); end); button6.MouseClick:connect(function()addDigit(6); end); button7.MouseClick:connect(function()addDigit(7); end); button8.MouseClick:connect(function()addDigit(8); end); button9.MouseClick:connect(function()addDigit(9); end); button10.MouseClick:connect(function()addDigit(0); end); Oraz na przyciski funkcyjne: button12.MouseClick:connect(function()DynCode=nil; end); button11.MouseClick:connect(function() if KeyCode.Value DynCode then correct(); else incorrect(); end end); Na końcu stwórzmy pętlę, która co 0.1 sekundy będzie odświeżała tekst na wyświetlaczu. Trzeba jednak dodać, że string nie może przyjąć wartości nil. Dlatego też trzeba rozważyć możliwość o jego wystąpieniu i w takim wypadku wypisać pusty tekst: while true do wait(0.1); if DynCode nil then Code.Text=""; else Code.Text=DynCode; end end Cały skrypt KeyCode = script.Parent:FindFirstChild("KeyCode"); DynCode = nil; button = { script.Parent:FindFirstChild("1"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("2"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("3"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("4"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("5"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("6"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("7"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("8"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("9"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("0"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("OK"):FindFirstChild("ClickDetector"), script.Parent:FindFirstChild("Clear"):FindFirstChild("ClickDetector"), } Door = script.Parent.Parent:FindFirstChild("Drzwi"); Approved = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Approved"); Code = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Code"); Denied = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Denied"); ableToInput = true; function addDigit(digit) if ableToInput true then if DynCode nil then DynCode = digit;--jezeli wpisywany kod jest pusty, to wpisywana cyfra jest cala liczba else DynCode = DynCode * 10 + digit; --jezeli kod ma wartosc, to zostaje ona pomnozona przez 10 czego skutkiem jest przesuniecie liczby w lewo i dodanie na koncu zera. W miejsce zera dodajemy nowa cyfre -- end end end function correct() Approved.Visible=true; Code.Visible=false; Denied.Visible=false; Door.CanCollide=false; Door.Transparency = 0.4; wait(4); Approved.Visible=false; Code.Visible=true; Door.CanCollide=true; Door.Transparency = 0; DynCode=nil; end function incorrect() Approved.Visible=false; Code.Visible=false; Denied.Visible=true; wait(3); Code.Visible=true; Denied.Visible=false; DynCode=nil; end button1.MouseClick:connect(function()addDigit(1); end); button2.MouseClick:connect(function()addDigit(2); end); button3.MouseClick:connect(function()addDigit(3); end); button4.MouseClick:connect(function()addDigit(4); end); button5.MouseClick:connect(function()addDigit(5); end); button6.MouseClick:connect(function()addDigit(6); end); button7.MouseClick:connect(function()addDigit(7); end); button8.MouseClick:connect(function()addDigit(8); end); button9.MouseClick:connect(function()addDigit(9); end); button10.MouseClick:connect(function()addDigit(0); end); button12.MouseClick:connect(function()DynCode=nil; end); button11.MouseClick:connect(function() if KeyCode.Value DynCode then correct(); else incorrect(); end end); while true do wait(0.1); if DynCode nil then Code.Text=""; else Code.Text=DynCode; end end Kategoria:Poradniki